package com.markor.tx.service.impl;

import com.markor.tx.bean.Animal;
import com.markor.tx.bean.Family;
import com.markor.tx.service.AnimalService;
import com.markor.tx.service.FamilyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @Author:zhangyanan
 * @Description:
 * @Date:Crated in 15:49 2018/3/14
 * @Modified By:
 */
@Service
public class AnimalServiceImpl implements AnimalService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private FamilyService familyService;

    @Transactional
    public void insert(Animal animal, Family family) {
        jdbcTemplate.update("insert into MK_ANIMAL (ANIMAL_NAME) values (?)", animal.getAnimalName());

        /**
         * 当前存在事务，加入当前事务
         */
        familyService.insertByRequired(family);
        //此时不属于同一个事务，如果抛出异常，family会插入成功
        System.out.println(1/0);

        /**
         * 如果当前有事务，则创建新事务，将当前事务挂起
         */
        /*familyService.insertByRequiresNew(family);
        //此时抛出异常，当前事物会回滚，familyService.insertByRequiresNew开启了独立的事务不会回滚
        System.out.println(1/0);*/

        /**
         * 当前存在事务，加入该事务
         */
        /*familyService.insertBySupports(family);
        //此时加入了当前的事务，属于同一事务，抛出异常，与animal一起回滚
        System.out.println(1/0);*/

        /**
         * 以非事务方式运行，如果当前存在事务，则把当前事务挂起
         */
        //没有事务，不会添加成功
        /*familyService.insertByNotSupported(family);*/

        /**
         * 抛异常
         */
        /*familyService.insertByNever(family);*/

        /**
         * 当前存在事务，加入该事物
         */
        /*familyService.insertByMandatory(family);*/

        /**
         * 当前存在事务，则创建一个事务作为当前事物的嵌套事务来执行
         * 意思是要么和当前事务一起成功，要么一起失败
         */
        /*familyService.insertByNested(family);
        System.out.println(1/0);*/
    }
}
